package learnjava.basic.other;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Method;

/**
    * @author wangc
    * @date 2021/6/17 上午 9:02
    * 写一个注解能实现自动化测试：当主方法执行后，会自动检测加了注解的所有方法，并把异常记录到日志
*/
public class AutoCheckUseAnno {

    public static void main(String[] args) throws Exception{
        //1，创建计算器对象
        Calculator ccl = new Calculator();
        //2，获取字节码文件对象
        Class cls = ccl.getClass();
        //3，获取所有方法
        Method[] methods = cls.getMethods();
        int number = 0; //异常次数
        BufferedWriter bw = new BufferedWriter(new FileWriter("bug.txt"));
        for (Method m: methods) {
            //4，判断方法上是否有注解
            if(m.isAnnotationPresent(MyTest.class)){
                //5，有则执行
                System.out.println(m.getName());
                try{
                    m.invoke(ccl);
                }catch (Exception e){
                    //6，有异常就捕获,记录到文件中
                    number++;
                    bw.newLine();
                    bw.write(m.getName()+"方法出异常了");
                    bw.newLine();
                    bw.write("异常的名称："+e.getCause().getClass().getSimpleName());
                    bw.newLine();
                    bw.write("异常的原因"+e.getCause().getMessage());
                    bw.newLine();
                    bw.write("------------------------------");
                }
            }
        }
        bw.newLine();
        bw.write("本次测试一共出现"+number+"次异常");
        bw.flush();
        bw.close();
    }
}


class Calculator{

    @MyTest
    public void add(){
        System.out.println("1+0="+(1+0));
    }
    @MyTest
    public void sub(){
        System.out.println("1-0="+(1-0));
    }
    @MyTest
    public void mul(){
        System.out.println("1*0="+(1*0));
    }
    @MyTest
    public void div(){
        System.out.println("1/0="+(1/0));
    }

    @MyTest
    public void makeException() throws IOException {
        throw new IOException("dd");
    }

    public void show(){
        System.out.println("0 error, 0 warning");
    }
}

@Target(value = {ElementType.METHOD})
@Retention(value = RetentionPolicy.RUNTIME)
@interface MyTest{

}

